195. Анаграмма
По заданному набору букв
сгенерировать все возможные слова в алфавитном порядке. Например, из слова
“abc” можно получить слова abc, acb, bac, bca, cab, cba. Буквы в слове могут
повторяться.
Вход.
Первая строка содержит количество тестов. Каждая следующая строка содержит
слово из букв латинского алфавита (от A до Z). Буквы верхнего и нижнего
регистра считать различными.
Выход. Для каждого входного теста
вывести все возможные слова, которые можно получить из заданных букв, в
возрастающем алфавитном порядке. Каждое слово
выводить в отдельной строке. В алфавитном порядке буква верхнего
регистра меньше соответствующей буквы нижнего регистра.
3
aAb
abc
acba
Aab
Aba
aAb
abA
bAa
baA
abc
acb
bac
bca
cab
cba
aabc
aacb
abac
abca
acab
acba
baac
baca
bcaa
caab
caba
cbaa
комбинаторика, генерация перестановок
Подсказка
1. Чем отличается лексикографическая сортировка слов от
алфавитной?
2. Рассмотрим строку zAZaaZ.
Укажите порядок букв при их алфавитной и лексикографической сортировке.
3. При помощи какой функции STL можно реализовать генерацию перестановок всех букв в
слове?
4. Функция sort по
умолчанию сортирует буквы
в слове в лексикографическои порядке. Как реализовать с ее помощью алфавитную
сортировку?
5.
Реализуйте функцию алфавитной сортировки int lt(char a, char b), которая передается в качестве
третьего аргумента функции sort.
6. Как по строке s найти алфавитно наименьшую перестановку букв?
Сортируем символы входной строки
по возрастанию. Далее используем встроенную функцию next_permutation для
генерации всех перестановок. При этом следует написать собственную функцию
сравнения символов. При стандартном (лексикографическом) сравнении любая буква
верхнего регистра будет меньше любой буквы нижнего регистра. То есть при
сортировке букв a, A, z, Z, r, R получим слово ARZarz. В задаче следует
сортировать (и генерировать перестановки) в соответствии с порядком AaBbCc…Zz,
необходимо из букв a, A, z, Z, r, R получить AaRrZz.
Для строки aAb (1 тест)
наименьшей перестановкой будет Aab, а наибольшей baA.
Функция lt будет использоваться при сортировке и
генерации перестановок. Она сравнивает два символа в соответствии с порядком
AaBbCc…Zz.
int lt(char
a, char b)
{
if
(toupper(a) != toupper(b)) return (toupper(a)
< toupper(b));
return (a
< b);
}
Читаем входную строку, вычисляем
ее длину и сортируем символы в алфавитном порядке.
scanf("%s", &s);len = strlen(s);
sort(s,s+len,lt);
Выводим текущую анаграмму
(перестановку символов) и генерируем следующую до тех пор пока это возможно.
do {
printf("%s\n",s);
} while(next_permutation(s,s+len,lt));